package com.cy.pj.modules.controller;

import com.cy.pj.module.pojo.RequestParameter;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;

/**
 * 在此对象中演示请求中参数的处理过程
 */
@RestController
public class ParamObjectController {

    //http://localhost/doParam01?id=10
    @RequestMapping("doParam01")
    public String doMethodParam(HttpServletRequest request){
            String idStr=request.getParameter("id");
            //假如我们后面业务需要一个整数，此时需要进行类型转换
            Integer id=Integer.parseInt(idStr);
            //后续可以基于整数id值执行后面的业务了，例如删除，查找..
            return "request params id's value is "+id;
    }

    //http://localhost/doParam02?id=20
    //当使用方法参数直接获取请求参数时，方法参数名要与请求参数名相同
    @RequestMapping("doParam02")
    public String doMethodParam(Integer id){//框架的力量
        return "request params id's value is "+id;
    }

    //http://localhost/doParam03?ids=1,2,3,4
    @RequestMapping("doParam03")
    public String doMethodParam(Integer[] ids){//框架的力量
        return "request params id's value is "+ Arrays.toString(ids);
    }

    //http://localhost/doParam04?startTime=2020/12/31
    //默认格式为yyyy/MM/dd
    @RequestMapping("doParam04")
    public String doMethodParam(Date startTime){//框架的力量
        return "request params id's value is "+ startTime;
    }

    //http://localhost/doParam0402?startTime=2020-12-31
    //假如方法要接收日期格式对象可以通过@DateTimeFormat注解指定可接收的日期格式
    @RequestMapping("doParam0402")
    public String doMethodParam2(@DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime){//框架的力量
        return "request params id's value is "+ startTime;
    }

    //http://localhost/doParam05?name=tony&page=2
    @RequestMapping("doParam05")
    public String doMethodParam(String name,Integer page){//框架的力量
        return "request params id's value is "+ name+":"+page;
    }

    //http://localhost/doParam0502?username=tony&page=2
    //假如在方法参数中需要指定某个参数的值必须在请求参数中有传递
    //@RequestParam这个注解用于描述方法参数，用于定义参数规则 默认required = true
    //1)方法参数变量的值，来自哪个参数,例如 @RequestParam("username"）
    //2)方法参数变量是否必须传值 例如@RequestParam(required = true)
    //3)@RequestParam(value="name",required = false)
    //@RequestMapping(value="doParam0502",method = RequestMethod.GET)
    @GetMapping("doParam0502")//简化形式
    public String doMethodParam02(
            @RequestParam("username") String name,
                                  @RequestParam(required = true) Integer page){//框架的力量
        return "request params id's value is "+ name+":"+page;
    }

   // http://localhost/doParam06?name=tony
    //当使用pojo对象封装请求参数时，请求中的参数名应与方法参数pojo对象中的set相关方法相匹配
    @GetMapping("doParam06")
    public String doMethodParam(RequestParameter param){
        return "request params id's value is "+param.toString();
    }

    //http://localhost/doParam07?name=tony&ids=1,2
    @GetMapping("doParam07")
    public String doMethodParam(RequestParameter param,Integer[] ids){
        return "request params id's value is "+param.toString()+",ids="+Arrays.toString(ids);
    }

    //http://localhost/doParam0702?name=tony&id=10,20
    //假如以这样方式直接在浏览器地址栏访问会有405异常
    //post请求可以借助postman工具进行访问
    @PostMapping("doParam0702")
    public String doMethodParam02(RequestParameter param,Integer... ids){
        return "request params id's value is "+param.toString()+",ids="+Arrays.toString(ids);
    }

    //http://localhost/doParam08?code=1&message=ok
    //假如以这样方式直接在浏览器地址栏访问会有405异常
    //post请求可以借助postman工具进行访问
    //使用map作为方法参数封装请求数据，默认是不可以,因为默认底层会认为是用于封装响应数据的
    //可以借助@RequestParam对map进行描述，来接收请求参数
    @PostMapping("doParam08")
    public String doMethodParam02(@RequestParam Map<String,Object> map){
        return "request params id's value is "+map.toString();
    }
    /**
     * @RequestBody注解描述方法参数时客户端
     *     可以以post方式提交json格式的数据
     */
    //http://localhost/doParam09
    //{"code":10,"message"："ok"}
    @PostMapping("doParam09")
    public String doMethodMapParam02(@RequestBody Map<String,Object> map){
        return "request params id's value is "+map.toString();
    }//报400异常（客户端请求的参数和服务器端可以处理的请求参数是不匹配的）


    //http://localhost/doParam10
    //{"name":"tony"}
    //说明@RequestBody注解描述的方法不能封装Get请求数据
    @PostMapping("doParam10")
    public String doMethodJsonParam(@RequestBody RequestParameter param){
        return "request params id's value is "+param.toString();
    }

    //====================rest 风格url参数获取================
    //rest风格：软件架构编码风格（可以跨端（跨平台））
    //rest风格url的定义：/path/{var1}/{var2},这里的{}括起来的为变量
    //@PathVariable注解描述方法参数变量时，表示这个参数的值来自url中{}表达式给定的值
    //例如：
    //http://localhost/doParam10/10/tony
    @GetMapping("/doParam10/{id}/{name}")
    public String doMethodRestUrlParam(@PathVariable Integer id,@PathVariable String name){
        return "request params id's value is " + id+",name="+name;
    }
}
